/**
 ******************************************************************************
 * @file           : bsp_iic.h
 * @brief          : IIC Driver Header File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * 硬件I2C驱动程序头文件（基于STM32 HAL库）
 * 提供标准I2C主机功能
 * 支持7位/10位地址模式
 * 支持标准速度(100kHz)和快速模式(400kHz)
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_IIC_H
#define __BSP_IIC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief I2C错误码枚举
 */
typedef enum
{
    IIC_OK = 0,                 /*!< 操作成功 */
    IIC_ERROR_PARAM,            /*!< 参数错误 */
    IIC_ERROR_TIMEOUT,          /*!< 超时错误 */
    IIC_ERROR_BUSY,             /*!< 总线忙 */
    IIC_ERROR_NACK,             /*!< 接收到NACK */
    IIC_ERROR_AF,               /*!< 应答失败 */
    IIC_ERROR_BERR,             /*!< 总线错误 */
    IIC_ERROR_ARLO,             /*!< 仲裁丢失 */
    IIC_ERROR_OVR,              /*!< 过载/欠载 */
    IIC_ERROR                   /*!< 未知错误 */
} IIC_Error_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void IIC_Init(void);                                                            /* I2C初始化 */
void IIC_DeInit(void);                                                          /* I2C反初始化 */

/* 内存读写函数（带寄存器地址） */
IIC_Error_e IIC_Write_Mem(uint16_t dev_addr, uint16_t mem_addr, 
                           uint8_t mem_addr_size, const uint8_t *data, uint16_t len);  /* 写设备内存 */
IIC_Error_e IIC_Read_Mem(uint16_t dev_addr, uint16_t mem_addr, 
                          uint8_t mem_addr_size, uint8_t *data, uint16_t len);        /* 读设备内存 */

/* 主机发送/接收函数（无寄存器地址） */
IIC_Error_e IIC_Master_Transmit(uint16_t dev_addr, const uint8_t *data, uint16_t len);  /* 主机发送数据 */
IIC_Error_e IIC_Master_Receive(uint16_t dev_addr, uint8_t *data, uint16_t len);         /* 主机接收数据 */

/* 设备检测函数 */
IIC_Error_e IIC_Is_Device_Ready(uint16_t dev_addr, uint8_t retry);             /* 检查设备就绪 */
void IIC_Scan_Bus(void);                                                        /* 扫描I2C总线 */

/* 错误处理函数 */
const char* IIC_Get_Error_String(IIC_Error_e error);                           /* 获取错误描述 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IIC_H */
